//
// Created by pangy on 2025/5/10.
//

#ifndef SQLIST_H
#define SQLIST_H

#include <stdio.h>
#include <stdlib.h>
#include "Status.h"

#define LIST_INIT_SIZE  100         // 线性表存储空间的初始分配量
#define LIST_INCREMENT  10          // 线性表存储空间的分配增量

/* 数据元素类型定义 */
typedef int ElemType;

/* 线性表结构 */
typedef struct {
    ElemType *elem;             // 线性表数据元素指针
    int length;                 // 线性表长度
    int listSize;               // 线性表分配空间大小(数据元素单位)
} SqList;

/* 线性表基本操作 顺序表实现 */


/**
 * 初始化
 * 成功返回OK,失败返回ERROR
*/
Status InitList(SqList* L);


/**
 * 销毁线性表
 * 成功返回OK, 失败返回ERROR
 * */
Status DestroyList(SqList* L);

/**
 * 清空线性表
 * 成功返回OK,失败返回ERROR
*/
Status ClearList(SqList* L);

/**
 * 线性表判空
 * 空表返回TRUE, 否则返回FALSE
 * */
Boolean ListEmpty(SqList L);

/**
 * 线性表长度
 * 返回线性表长度, 空表返回0
 * */
int ListLength(SqList L);

/**
 * 获取线性表指定位置的数据元素
 * @param L 线性表
 * @param i 索引
 * @param e 接收数据元素
 * @return OK/ERROR
 */
Status GetElem(SqList L, int i, ElemType* e);

/**
 * 查找指定元素位置
 * @param L 线性表
 * @param e 查找元素
 * @param Compare 比较函数
 * @return 与e匹配的数据元素的位置, 未找到返回0
 */
int LocateElem(SqList L, ElemType e, Status (*Compare)(ElemType, ElemType));

/**
 * 获取指定元素前驱
 * @param L 线性表
 * @param cur_e 指定数据元素
 * @param pre_e 前驱
 * @return OK/ERROR
 */
Status PriorElem(SqList L, ElemType cur_e, ElemType* pre_e);

/**
 * 获取指定元素后继
 * @param L 线性表
 * @param cur_e 指定数据元素
 * @param next_e 后继
 * @return OK/ERROR
 */
Status NextElem(SqList L, ElemType cur_e, ElemType* next_e);

/**
 * 在指定位置之前插入数据元素
 * @param L 线性表
 * @param i 指定位置
 * @param e 插入数据元素
 * @return OK/ERROR
 */
Status ListInsert(SqList* L, int i, ElemType e);

/**
 * 删除指定位置的数据元素
 * @param L 线性表
 * @param i 位置
 * @param e 删除的数据元素
 * @return OK/ERROR
 */
Status ListDelete(SqList* L, int i, ElemType* e);

/**
 * 线性表数据元素依次操作
 * @param L 线性表
 * @param Visit 操作函数
 */
void ListTraverse(SqList L, void (*Visit)(ElemType));



#endif // SQLIST_H